﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Classes
{
    interface IGraphImpl
    {		///<summary>
        ///adds a city to the graph
        ///</summary>
        void AddCity(City city);

        ///<summary>
        ///adds an flight to the (unweighted) graph
        ///PRE (to,from) is not contained in the graph
        ///</summary>
        void AddFlight(City startCity, City endCity);

        ///<summary>
        ///determines whether a city is in the graph
        ///</summary>
        bool ContainsCity(City city);

        ///<summary>
        ///determines whether two cities are adjacent
        ///</summary>
        bool IsAdjacent(City startCity, City endCity);

        ///<summary>
        ///Returns a list containing all cities adjancent to city.
        ///Must be a list since it should be possible to remove adjacent cities
        ///</summary>
        IList<City> GetAdjacencies(City city);

        ///<summary>
        ///Returns an Enumerator to the collection of Cities
        ///</summary>
   //     IEnumerator<City> Cities();

        ///<summary>
        ///determines whether the graph is empty
        ///</summary>
        bool IsEmpty();

        ///<summary>
        ///returns the number of vertices
        ///</summary>
        int GetNoOfCities();

        ///<summary>
        ///returns the number of flights
        ///</summary>
        int GetNoOfFlights();

        ///<summary>
        ///makes the graph empty
        ///</summary>
        void Clear();
 //       IList<City> GetCitiesConnection(City cityFrom);

     //   void Bfs(City c);
        void Dfs(City c);
      //   IList<Flight> GetASpanTreesFlights(City cityFrom, City cityTo);
         IList<Flight> GetSpanTree(City city);
     //    IList<Flight> Connection(City from, City to);
         IList<City> GetParentsOfThisCity(City city);
       //  IList<City> MakeASequenceOfCities(City city);
         IList<City>  MakeASequenceOfCitiesFromASequenceOfCities(IList<City> cityList);
         IList<City> ReturnCityList();
     //    IList<City> GetCities(City city);
         IList<City> SpanTreeCities(City city);
        //  IList<City> GetSequenceOfParentCities(City city);
          void AddSpanTreeToTheConnection(IList<Flight> spanTreeFlights);
          Connection ReturnConnection();
          void Bfs(City v);
          IList<Flight> SpanTreeOfFlightsInBfs(City v);
          void SetTheCityFrom(City v);
        void SetTheCityTo(City v);
        ListOfConnections BreadthFirst(IList<City> visited);
         //
       // IList<Flight> SearchForConnection(City from, City to);
       //  ListOfConnections FindConnections(City from, City to);
      //   IList<Flight> GetARoutetoTheCity(City from, City to);

        //void Unmark();

      
    }
}
